//easyUI 函数库
//@author Leo.Liao

// ====================================================== Datagird strat

/**
 * 验证指定行
 * @param gridId
 * @param index
 * @returns {jQuery|*}
 */
function validateRow(gridId, index) {
    return $("#" + gridId + "").datagrid("validateRow", index);
}

/**
 * 為datagrid組件設置列數據
 * @param gridId
 * @param columns
 */
function setColumnsForDatagrid(gridId, columns) {
    $('#' + gridId).datagrid({
        columns: columns
    });
}

/**
 * 从data多行数据中选取指定列拼接成一个字符串（包含\n）
 * @param rows
 * @param column
 * @returns {string}
 */
function getStrWithRows(rows, column) {
    let values = "";
    for (let rowIndex in rows) {
        values += rows[rowIndex][column] + "\n";
    }
    return values;
}

/**
 * 从多行数据中选取指定列计算和并返回
 * @param rows
 * @param column
 * @returns {number}
 */
function getSumWithRows(rows, column) {
    let sum = 0;
    for (let rowIndex in rows) {
        if (rows[rowIndex][column] != undefined) {
            let tempNum = parseFloat(rows[rowIndex][column] + "");
            sum += tempNum;
        }
    }
    return sum;
}

/**
 * 从data多行数据中选取指定列(多列)拼接成一个字符串（包含\n）
 * @param rows
 * @param columns
 * @returns {string}
 */
function getMultiValuesWithRows(rows, columns) {
    let values = "";
    for (let rowIndex in rows) {
        for (let columnsIndex in columns) {
            values += rows[rowIndex][columns[columnsIndex]] + "\n";
        }
    }
    return values;
}

/**
 * 获取页面对象参数
 * @param gridId
 * @returns {*|jQuery}
 */
function getPagerOptions(gridId) {
    return $("#" + gridId + "").datagrid("getPager").pagination("options");
}

/**
 * 加載數字框
 * @param id
 * @param min
 * @param max
 * @param precision
 * @param value
 */
function loadNumberbox(id, min, max, precision, value, onChange) {
    $("#" + id).numberbox({
        min: min,
        max: max,
        precision: precision,
        value: value,
        onChange: onChange
    })
}

/**
 * 为 datagrid 的指定编辑器赋值
 * @param gridId 数据表格Id
 * @param field 编辑器字段
 * @param index 编辑器行
 * @param value 要设置的值
 */
function setValueForEditorNumberBox(gridId, field, index, value) {
    let ed = $('#' + gridId + '').datagrid('getEditor', {index: index, field: field});
    ed.target.numberbox('setValue', value);
}

/**
 * 获取尾行数据
 * @param gridId
 * @returns {*|jQuery}
 */
function getFooterRows(gridId) {
    return $("#" + gridId + "").datagrid("getFooterRows");
}

/**
 * 开启编辑
 * @param gridId
 * @param index
 */
function beginEdit(gridId, index) {
    $('#' + gridId + '').datagrid('beginEdit', index);
}

/**
 * 结束编辑
 * @param gridId
 * @param index
 */
function endEdit(gridId, index) {
    $('#' + gridId + '').datagrid('endEdit', index);
}

/**
 * 在最后一行之后添加一行数据
 * @param gridId
 * @param params
 */
function appendRow(gridId, params) {
    $('#' + gridId + '').datagrid('appendRow', params);
}

/**
 * 在第二行的位置添加一行数据
 * @param gridId
 * @param params
 */
function insertRow(gridId, params) {
    $('#' + gridId + '').datagrid('insertRow', {
        index: 1,
        row: params
    });
}

/**
 * 删除一行数据
 * @param gridId
 * @param index
 */
function deleteRow(gridId, index) {
    $('#' + gridId + '').datagrid('deleteRow', index);
}

/**
 * 删除多行数据
 * @param gridId
 * @param rows
 */
function deleteRows(gridId, rows) {
    if (gridId == null) return;
    if (rows == null || rows.length == 0) return;
    for (let index = 0; index < rows.length; index++) {
        let rowIndex = $('#' + gridId + '').datagrid('getRowIndex', rows[index]);
        $('#' + gridId + '').datagrid('deleteRow', rowIndex);
    }
}

/**
 * 获取行索引
 * @param gridId
 * @param row
 * @returns {*|jQuery}
 */
function getRowIndex(gridId, row) {
    return $('#' + gridId + '').datagrid('getRowIndex', row);
}

/**
 * 回滚所有从创建或者上一次调用acceptChanges函数后更改的数据。
 *
 * @param gridId
 */
function rejectChanges(gridId) {
    $('#' + gridId + '').datagrid('rejectChanges');
}

/**
 * 获取新插入的行
 * @param gridId
 * @returns {*|jQuery}
 */
function getInserted(gridId) {
    return $('#' + gridId + '').datagrid('getChanges', 'inserted');
}

/**
 * 获取被删除的行
 * @param gridId
 * @returns {*|jQuery}
 */
function getDeleted(gridId) {
    return $('#' + gridId + '').datagrid('getChanges', 'deleted');
}

/**
 * 获取更新过的行
 * @param gridId
 * @returns {*|jQuery}
 */
function getUpdated(gridId) {
    return $('#' + gridId + '').datagrid('getChanges', 'updated');
}

/**
 * 选择一行数据
 * @param gridId
 * @param index
 */
function selectRow(gridId, index) {
    $('#' + gridId + '').datagrid('selectRow', index);
}

/**
 * 获取当前页面所有行
 * @param gridId
 * @returns {*|jQuery}
 */
function getRows(gridId) {
    return $('#' + gridId + '').datagrid('getRows');
}

/**
 * 在datagrid 分页工具栏上添加按钮
 *
 * @param gridId dataGridID
 * @param buttons 按钮组
 */
function addButtons4pageTB(gridId, buttons) {
    let pager = $('#' + gridId + '').datagrid('getPager');
    pager.pagination({
        loading: false,
        buttons: buttons
    });
}

/**
 * 返回所有被选中的行，当没有记录被选中的时候将返回一个空数组。
 * @param gridId
 * @returns {*|jQuery}
 */
function getSelections(gridId) {
    return $("#" + gridId + "").datagrid("getSelections");
}

/**
 * 返回第一个被选中的行或如果没有选中的行则返回null。
 * @param gridId
 * @returns {*|jQuery}
 */
function getSelected(gridId) {
    return $("#" + gridId + "").datagrid("getSelected");
}

// ====================================================== Datagird end
// ====================================================== Datalist start

/**
 * 异步加载Datalist
 * @param id
 * @param url
 */
function loadDataList(id, url) {
    $('#' + id).datalist({
        url: url + "?" + tokenKey + "=" + authentication,
    });
}

// ====================================================== Datalist end

// ======================================================= window start

/**
 * 确认提示框，点击确认后执行回调函数
 *
 * @param title
 * @param message
 * @param callback
 */
function euConfirm(title, message, callback) {
    $.messager.confirm(title, message, function (r) {
        if (r) {
            callback();
        }
    });
}

/**
 * 显示处理过程
 * @param message
 */
function showProgress(title,message,text) {
    if(message == null || "" == message){message = "Loading";}
    if(title == null || "" == title){message = "Information";}
    if(text == null || "" == text){text = "Waiting..."}
    $.messager.progress({
        title: title,
        msg: message,
        text: text
    });
}

/**
 * 关闭处理过程
 */
function closeProgress() {
    $.messager.progress('close');
}

/**
 * 打開窗口
 * @param windowId
 * @param title
 */
function openWindow(windowId, title) {
    $('#' + windowId + '').window('open').window("setTitle", title);
}

/**
 * 关闭窗口
 * @param windowId
 */
function closeWindow(windowId) {
    $('#' + windowId + '').window('close');
}

/**
 * 打开对话框
 * @param dialogId
 * @param title
 */
function openDialog(dialogId, title) {
    $("#" + dialogId + "").dialog("open").dialog("setTitle", title);
}

/**
 * 关闭对话框
 * @param dialogId
 */
function closeDialog(dialogId) {
    $("#" + dialogId + "").dialog("close");
}

/**
 * 打开对话框，并自动填写行数据到表单中
 * @param dialogId
 * @param formId
 * @param row
 * @param title
 */
function  openDialogAndFillInFormWithRowData(dialogId, formId, row, title) {
    $("#" + dialogId + "").dialog("open").dialog("setTitle", title);
    $("#" + formId + "").form("load", row);
}

/**
 * 弹出提示框
 * @param title
 * @param message
 */
function euAlert(title, message,type) {
    $.messager.alert(title, message,type);
}

/**
 * 弹出右下角提示框，3秒钟之后自动消失
 * @param title
 * @param message
 */
function euShow(title, message) {
    $.messager.show({
        title: title,
        msg: message,
        timeout: 3000,
        showType: 'slide'
    });

}

// ================================================================== Window end


// =================================================================== Form start

/**
 * 填充数据到表单
 * @param formId
 * @param row
 */
function fillInFormWithRowData(formId, row) {
    $("#" + formId + "").form("load", row);
}

/**
 * 重置表单数据
 * @param formId
 */
function resetFrom(formId) {
    $("#" + formId + "").form("reset");
    // 清除隱藏域
    let objId = document.getElementById(formId);
    if (objId == undefined) {
        return;
    }
    for (let i = 0; i < objId.elements.length; i++) {
        if (objId.elements[i].type == "hidden") {
            objId.elements[i].value = "";
        }
    }
}

/**
 * 填充表单数据
 * @param formId
 * @param row
 */
function loadFormData(formId, row) {
    $("#" + formId + "").form("load", row);
}

/**
 * 表单验证
 * @param formId
 * @returns {jQuery|*}
 */
function formValidate(formId) {
    return $("#" + formId + "").form("validate");
}

/**
 * 获取表单数据
 * @param formId
 * @returns {[]}
 */
function getFormData(formId) {
    let values = {};
    if(formId == null || formId == ""){ return values; }
    let form = document.getElementById(formId);
    if(form == null){ return values;}
    for (let i = 0; i < form.length; i++) {
        let element = form.elements[i];
        if(element.type == "radio" && !element.checked){
            continue;
        }
        let value = element.value;
        let name = element.name;
        values[name] = value;
    }
    return values;
}

// =================================================================== Form end

// =================================================================== Combobox start

/**
 * 异步加载下拉数据表格
 * @param id
 * @param url
 * @param valueField
 * @param textField
 * @param columns
 * @param panelWidth
 * @param onSelectCallback
 */
function remoteLoadCombogrid(id, url, valueField, textField, columns,panelWidth,onSelectCallback,queryParams) {
    $('#'+id).combogrid({
        method:"get",
        fitColumns:true,
        panelWidth:panelWidth,
        mode: 'remote',
        idField:valueField,
        textField:textField,
        url:url,
        columns:columns,
        remoteSort:false,
        onSelect:onSelectCallback,
        queryParams: queryParams,
    });
}

/**
 * 加载下拉列表
 * @param id
 * @param data
 * @param onSelectCallback
 */
function loadCombobox(id, data, onSelectCallback) {
    $("#" + id).combobox({
        data: data,
        onSelect: onSelectCallback
    });
}

/**
 * 设置Combobox数据
 * @param combId
 * @param value
 */
function setValue4Combobox(combId, value) {
    $('#' + combId + '').combobox('select', value);
}

/**
 * 设置ComboGrid数据
 * @param id
 * @param param
 */
function setValue4ComboGird(id,param){
    $('#'+id).combogrid('setValue', param);
}

/**
 * 获取Combbox数据
 * @param combId
 * @returns {jQuery}
 */
function getValue8Combobox(combId) {
    return $('#' + combId + '').combobox('getValue');
}

/**
 * 设置下拉列表框状态（是否只读）
 * @param id
 * @param status
 */
function setComboboxDisabled(id, status) {
    $("#" + id + "").combobox({disabled: status});
}

// =================================================================== Combobox end

// =================================================================== Textbox start

function setTextForFilebox(id, text) {
    $('#' + id).filebox({
        buttonText: text
    });
}

/**
 * 文本框数据远程校验
 * @param boxId 文本框ID
 * @param url 远程校验地址
 * @param dataName 校验字段名称
 * @param param 额外参数（XX=XX&YY=YY）
 */
function textboxRemoteValidate(boxId, url, dataName, params, invalidMessage) {
    if ("" != params) url += '?' + params;
    $('#' + boxId + '').textbox({
        required: true,
        validType: {remote: [url, dataName]},
        invalidMessage: invalidMessage
    });
}

/**
 * 数值输入框数据远程校验
 * @param boxId
 * @param url
 * @param dataName
 * @param params
 * @param invalidMessage
 */
function numberboxRemoteValidate(boxId, url, dataName, params, invalidMessage) {
    if ("" != params) url += '?' + params;
    $('#' + boxId + '').numberbox({
        required: true,
        validType: {remote: [url, dataName]},
        invalidMessage: invalidMessage
    });
}

/**
 * 文本框远程数据校验
 * @param boxId
 * @param url
 * @param dataName
 * @param params
 * @param invalidMessage
 */
function euTextboxRemoteValidate(boxId, url, dataName, invalidMessage, urlSuffix) {
    if(urlSuffix == null || urlSuffix == undefined){
        urlSuffix = "";
    }
    $('#' + boxId + '').textbox({
        required: true,
        validType: {remote: [API_URL + url + "?" + TOKEN_KEY + "=" + token + urlSuffix, dataName]},
        invalidMessage: invalidMessage
    });
}

/**
 * 移除文本框远程数据校验
 * @param boxId
 * @param url
 * @param dataName
 * @param params
 * @param invalidMessage
 */
function removeRemoteValidate(boxId) {
    $('#' + boxId + '').textbox({
        validType: {},
    });
}

/**
 * 移除文本框远程数据校验函数
 * @param boxId
 */
function removeEuTextboxRemoteValidate(boxId) {
    $('#' + boxId + '').textbox({
        required: true,
        validType: {}
    });
}

/**
 * 設置提示信息
 * @param boxId
 * @param prompt
 */
function setPromptForTextbox(boxId, prompt) {
    $('#' + boxId).textbox({prompt: prompt});
}

/**
 * 文本框获取焦点
 * @param id
 */
function textboxFocus(id) {
    $('#' + id).textbox('textbox').focus();
}

/**
 * 设置文本框标签
 * @param boxId
 * @param prompt
 */
function setLabelForTextbox(boxId, label, labelWidth) {
    if (labelWidth == null) {
        labelWidth = 150;
    }
    $('#' + boxId).textbox({label: label, labelWidth: labelWidth});
}

/**
 * 设置文件框标签
 * @param boxId
 * @param prompt
 */
function setLabelForFilebox(boxId, label, labelWidth) {
    if (labelWidth == null) {
        labelWidth = 150;
    }
    $('#' + boxId).filebox({label: label, labelWidth: labelWidth});
}

/**
 * 设置Easyui文本框只读属性
 * @param textboxId
 * @param status
 */
function setEUTextboxReadonly(textboxId, status) {
    $('#' + textboxId + '').textbox({
        readonly: status
    });
}

/**
 * 为true时将验证框设为只读（在表单提交时会被提交）。（该属性自1.4.5版开始可用）
 *
 * @param numberboxId
 * @param status
 */
function setEUNumberboxReadonly(numberboxId, status) {
    $('#' + numberboxId + '').numberbox({
        readonly: status
    });
}

/**
 * 为true时禁用验证框（在表单提交时不会被提交）。（该属性自1.4.5版开始可用）
 *
 * @param numberboxId
 * @param status
 */
function setEUNumberboxDisabled(numberboxId, status) {
    $('#' + numberboxId + '').numberbox({
        disabled: status
    });
}

/**
 * 获取普通文本框的值
 * @param textboxId
 * @returns {jQuery}
 */
function getValue8Textbox(textboxId) {
    return $('#' + textboxId + '').val();
}

/**
 * 设置普通文本框的值
 * @param textboxId
 * @param value
 */
function setValue4Textbox(textboxId, value) {
    $('#' + textboxId + '').val(value);
}

/**
 * 设置数值输入框的值
 * @param id
 * @param value
 */
function setValue4Numberbox(id, value) {
    $('#' + id + '').numberbox('setValue', value);
}

/**
 * 获取数值输入框的值
 * @param id
 * @returns {jQuery|*|*|*}
 */
function getValue8Numberbox(id) {
    return $('#' + id + '').numberbox('getValue');
}

/**
 * 获取Easyui文本框的值
 * @param textboxId
 * @returns {jQuery}
 */
function getEUTextboxValue(textboxId) {
    return $('#' + textboxId + '').textbox('getValue');
}

/**
 * 设置日期时间输入框的值
 * @param id
 * @param value
 */
function setValue4DateTimeBox(id,value) {
    $('#' + id).datetimebox('setValue',value);
}

/**
 * 设置日期输入框的值
 * @param id
 * @param value
 */
function setValue4DateBox(id,value) {
    $('#' + id).datebox('setValue',value);
}

/**
 * 获取日期输入框的值并转为毫秒值
 * @param id
 * @returns {null|number}
 */
function getTimestamp(id){
    let dateStr = getEUTextboxValue(id) + "";
    if(dateStr == null || dateStr == ""){
        return null;
    }
    let date = new Date(dateStr);
    return date.getTime();
}

/**
 * 设置Easyui文本框的值
 * @param textboxId
 * @param value
 */
function setValue4EUTextbox(textboxId, value) {
    $('#' + textboxId + '').textbox('setValue', value);
}

// =================================================================== Textbox end

// =================================================================== tree start

/**
 * 通过远程数据加载数据树
 * @param treeId 组件id
 * @param url 远程数据加载地址
 * @param callback 加载完成回调
 * @param onclick 节点点击事件
 */
function loadTree(id, url, callback, onclick) {
    $("#" + id + "").tree({
        lines: true,
        url: url,
        onLoadSuccess: callback,
        onClick: onclick
    });
}

/**
 * 展开所有节点
 * @param id
 */
function expandAll(id) {
    $("#" + id + "").tree('expandAll');
}

// =================================================================== tree end

// =================================================================== tabs start

/**
 * 更新tab标题
 * @param tabsId tabs组件id
 * @param tabIndex tabs中的tab序号
 * @param title 标题
 */
function resetTitleForTab(tabsId, tabIndex, title) {
    let tab = $('#' + tabsId).tabs('getTab', tabIndex);
    $('#' + tabsId).tabs('update', {
        tab: tab,
        options: {
            title: title
        }
    });
}

// =================================================================== tabs end

// =================================================================== panel start


/**
 * 更新panel标题
 * @param panelId
 * @param title
 */
function setTitleForPanel(panelId, title) {
    $('#' + panelId).panel('setTitle', title);
}

// =================================================================== panel end

// =================================================================== Others start

/**
 * 设置easyui按钮文本
 * @param buttonId
 * @param text
 */
function setEuButtonText(buttonId, text) {
    $('#' + buttonId).linkbutton({
        text: text
    });
}

/**
 * 设置按钮是否可用
 * @param buttonId
 * @param status
 */
function setEuButtonDisabled(buttonId, status) {
    $('#' + buttonId).linkbutton({
        disabled: status
    });
}


/**
 * 获取url请求参数
 * @param name
 * @returns {*}
 */
function getUrlParam(name) {
    let reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)");
    let r = window.location.search.substr(1).match(reg);
    if (r != null) return unescape(r[2]);
    return null;
}

/**
 * 添加键盘监听事件
 *
 * @param code 按键代码
 * @param action 触发动作
 */
function addKeyListener(code, action) {
    $(document).keyup(function (event) {
        if (event.keyCode == code) {
            action();
        }
    });
}

/**
 * 在原有的基础上增加值
 * 
 * @param id
 * @param value
 */
function addValue(id, value) {
    let oldValue = $("#" + id + "").val();
    $("#" + id + "").val(oldValue + value);
}

/**
 * 为html元素设置值
 * @param id
 * @param value
 */
function setValue(id, value) {
    if (value == null) value = "";
    $("#" + id + "").val(value);
}

/**
 * 批量设为html元素设置值
 * @param datas 数据键值对
 * @param dataIds 数据key(HTML元素ID应与key相同)
 */
function setValues(data, dataIds) {
    for (let dataIdIndex in dataIds) {
        setValue(dataIds[dataIdIndex], data[dataIds[dataIdIndex]]);
    }
}

/**
 * 为html元素设置文本数据
 * @param id
 * @param text
 */
function setText(id, text) {
    if (text == null) text = "";
    $("#" + id + "").text(text);
}


/**
 * 批量设为html元素设置文本数据
 * @param datas
 * @param dataIds
 */
function setTexts(data, dataIds) {
    for (let dataIdIndex in dataIds) {
        setText(dataIds[dataIdIndex], data[dataIds[dataIdIndex]]);
    }
}

/**
 * 向指定元素中增加HTML代码
 * @param id
 * @param htmlStr
 */
function insertHTML(id, htmlStr) {
    $("#" + id + "").append(htmlStr);
}

/**
 * 清空指定节点
 * @param id
 */
function emptyHTML(id) {
    $("#" + id + "").empty();
}

/**
 * 获取子节点
 * @param id
 */
function getChildren(id) {
    return document.getElementById(id).innerHTML;
    //return $("#"+id+"").children();
}

/**
 * 用指定数据生成表头HTML代码
 * @param headData
 * @returns
 */
function builtHeadRow(headData) {
    let headHtmlStr = "<tr>";
    let keys = Object.keys(headData);
    for (let keyIndex in keys) {
        headHtmlStr += "<td style='background-color: #999999' width='" + headData[keys[keyIndex]] + "'>" + keys[keyIndex] + "</td>";
    }
    return headHtmlStr + "</tr>";
}

/**
 * 用指定数据生成表格行HTML代码
 * @param rows 若干行数据
 * @param columns 列数据
 * @returns HTML代码
 */
function builtRows(rows, columns) {
    let htmlStr = "";
    for (let rowIndex in rows) {
        htmlStr += "<tr>";
        for (let columnIndex in columns) {
            let column = columns[columnIndex];
            let columnVal = rows[rowIndex][column];
            if (columnVal == null) columnVal = "";
            htmlStr += "<td>" + columnVal + "</td>";
        }
        htmlStr += "</tr>";
    }
    return htmlStr;
}

/**
 * 用指定数据生成表格行HTML代码（每行数据下增加额外的行）
 * @param rows
 * @param columns
 * @param getExtraRow
 * @returns {string}
 */
function builtMultiRows(rows, columns, getExtraRow) {
    let htmlStr = "";
    for (let rowIndex in rows) {
        htmlStr += "<tr>";
        for (let columnIndex in columns) {
            let column = columns[columnIndex];
            let columnVal = rows[rowIndex][column];
            if (columnVal == null) columnVal = "";
            htmlStr += "<td>" + columnVal + "</td>";
        }
        htmlStr += "</tr>";
        htmlStr += getExtraRow(rows[rowIndex]);
    }
    return htmlStr;
}

/**
 * 打印
 * @param title
 * @param contentId
 * @param pageHeader
 * @constructor
 */
function print(contentId, pageHeader, callback) {
    let printBox = document.getElementById(contentId);
    let printContent = printBox.innerHTML;
    console.log(printContent);
    let printWindow = window.open('', "_blank");
    printWindow.document.write(printContent);
    printWindow.document.title = pageHeader;
    printWindow.print();
    printWindow.close();

    callback();
}

/**
 * 获取当前系统时间，精确到毫秒
 * @returns {string}
 */
function getCurrentTimePrecise() {
    let date = new Date();
    let yy = date.getFullYear();
    let MM = date.getMonth() + 1;
    let dd = date.getDay();
    let hh = date.getHours();
    let mm = date.getMinutes();
    let ss = date.getSeconds();
    let sss = date.getMilliseconds();
    let result = yy + "-" + MM + "-" + dd + " " + hh + ":" + mm + ":" + ss + "," + sss;
    return result;
}

/**
 * 获取cookie值
 * @param cookieName
 * @returns {string}
 */
function getCookie(name) {
    let arr, reg = new RegExp("(^| )" + name + "=([^;]*)(;|$)");
    if (arr = document.cookie.match(reg))
        return unescape(arr[2]);
    else
        return "";
}

/**
 * 设置cookie
 * @param name cookie名
 * @param value cookie值
 * @param timeout 超時時間，單位毫秒，若為空則默認超時時間30天
 */
function setCookie(name, value, timeout) {
    if (timeout == null) {
        timeout = 30 * 24 * 60 * 60 * 1000
    }
    let exp = new Date();
    exp.setTime(exp.getTime() + timeout);
    document.cookie = name + "=" + escape(value) + ";path=/;expires=" + exp.toGMTString();
}

/**
 * 获取RSA公钥
 */
function getPublicKey() {
    let responseJSON = syncRequest("POST", "/public/getPublicKey");
    return responseJSON.data;
}

/**
 * RSA公钥加密
 * @param data
 * @param publicKey
 * @returns {string}
 */
function publicEncrypt(data, publicKey) {
    let encryptor = new JSEncrypt();
    encryptor.setPublicKey(publicKey);
    return encryptor.encrypt(data);
}

/**
 * 加法
 * @param arg1
 * @param arg2
 * @returns {string}
 */
function add(arg1, arg2) {
    let r1, r2, m, n;
    try {
        r1 = arg1.toString().split(".")[1].length
    } catch (e) {
        r1 = 0
    }
    try {
        r2 = arg2.toString().split(".")[1].length
    } catch (e) {
        r2 = 0
    }
    m = Math.pow(10, Math.max(r1, r2));
    return ((arg1 * m + arg2 * m) / m).toFixed(2);
}

/**
 * 減法
 * @param arg1
 * @param arg2
 * @returns {string}
 * @constructor
 */
function sub(arg1, arg2) {
    let r1, r2, m, n;
    try {
        r1 = arg1.toString().split(".")[1].length
    } catch (e) {
        r1 = 0
    }
    try {
        r2 = arg2.toString().split(".")[1].length
    } catch (e) {
        r2 = 0
    }
    m = Math.pow(10, Math.max(r1, r2));
    //last modify by deeka
    return ((arg1 * m - arg2 * m) / m).toFixed(2);
}

/**
 * 乘法
 * @param arg1
 * @param arg2
 * @returns {number}
 */
function multi(arg1, arg2) {
    let m = 0, s1 = arg1.toString(), s2 = arg2.toString();
    try {
        m += s1.split(".")[1].length
    } catch (e) {
    }
    try {
        m += s2.split(".")[1].length
    } catch (e) {
    }
    return Number(s1.replace(".", "")) * Number(s2.replace(".", "")) / Math.pow(10, m)
}

/**
 * 除法
 * @param arg1
 * @param arg2
 * @returns {number}
 */
function accDiv(arg1, arg2) {
    let t1 = 0, t2 = 0, r1, r2;
    try {
        t1 = arg1.toString().split(".")[1].length
    } catch (e) {
    }
    try {
        t2 = arg2.toString().split(".")[1].length
    } catch (e) {
    }
    with (Math) {
        r1 = Number(arg1.toString().replace(".", ""))
        r2 = Number(arg2.toString().replace(".", ""))
        return (r1 / r2) * pow(10, t2 - t1);
    }
}

/**
 * 预览图片
 * @param fileObj
 * @param imgPreviewId
 * @param divPreviewId
 * @constructor
 */
function previewImage(fileObj, imgPreviewId, divPreviewId, allowExtension) {
    let extension = fileObj.value.substring(fileObj.value.lastIndexOf(".") + 1).toLowerCase();
    let browserVersion = window.navigator.userAgent.toUpperCase();
    if (allowExtension.indexOf(extension) > -1) {
        if (fileObj.files) {//HTML5实现预览，兼容chrome、火狐7+等
            if (window.FileReader) {
                let reader = new FileReader();
                reader.onload = function (e) {
                    document.getElementById(imgPreviewId).setAttribute("src", e.target.result);
                }
                reader.readAsDataURL(fileObj.files[0]);
            } else if (browserVersion.indexOf("SAFARI") > -1) {
                alert("不支持Safari6.0以下浏览器的图片预览!");
            }
        } else if (browserVersion.indexOf("MSIE") > -1) {
            if (browserVersion.indexOf("MSIE 6") > -1) {//ie6
                document.getElementById(imgPreviewId).setAttribute("src", fileObj.value);
            } else {//ie[7-9]
                fileObj.select();
                if (browserVersion.indexOf("MSIE 9") > -1)
                    fileObj.blur();//不加上document.selection.createRange().text在ie9会拒绝访问
                let newPreview = document.getElementById(divPreviewId + "New");
                if (newPreview == null) {
                    newPreview = document.createElement("div");
                    newPreview.setAttribute("id", divPreviewId + "New");
                    newPreview.style.width = document.getElementById(imgPreviewId).width + "px";
                    newPreview.style.height = document.getElementById(imgPreviewId).height + "px";
                    newPreview.style.border = "solid 1px #d2e2e2";
                }
                newPreview.style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod='scale',src='" + document.selection.createRange().text + "')";
                let tempDivPreview = document.getElementById(divPreviewId);
                tempDivPreview.parentNode.insertBefore(newPreview, tempDivPreview);
                tempDivPreview.style.display = "none";
            }
        } else if (browserVersion.indexOf("FIREFOX") > -1) {//firefox
            let firefoxVersion = parseFloat(browserVersion.toLowerCase().match(/firefox\/([\d.]+)/)[1]);
            if (firefoxVersion < 7) {//firefox7以下版本
                document.getElementById(imgPreviewId).setAttribute("src", fileObj.files[0].getAsDataURL());
            } else {//firefox7.0+
                document.getElementById(imgPreviewId).setAttribute("src", window.URL.createObjectURL(fileObj.files[0]));
            }
        } else {
            document.getElementById(imgPreviewId).setAttribute("src", fileObj.value);
        }
    } else {
        alert("仅支持" + allowExtension + "为后缀名的文件!");
        fileObj.value = "";//清空选中文件
        if (browserVersion.indexOf("MSIE") > -1) {
            fileObj.select();
            document.selection.clear();
        }
        fileObj.outerHTML = fileObj.outerHTML;
    }
}

/**
 * 获取页面请求参数
 * @param variable
 * @returns {string|boolean}
 */
function getQueryVariable(variable) {
    let reg = new RegExp("(^|&)" + variable + "=([^&]*)(&|$)", "i");
    let r = window.location.search.substr(1).match(reg);
    if ( r != null ){
        return decodeURI(r[2]);
    }else{
        return "";
    }
}

/**
 * 删除空值
 * @param data
 */
function removeNullKey(data){
    for ( let key in data ){
        if ( data[key] == null || data[key] == '' ){
            delete data[key]
        }
    }
}

/**
 * 构建提交表单
 */
function dynamicSubmit(url, datas) {

    var form = $('#dynamicForm');

    if (form.length <= 0) {
        form = $("<form>");
        form.attr('id', 'dynamicForm');
        form.attr('style', 'display:none');
        form.attr('target', '');
        form.attr('method', 'post');

        $('body').append(form);
    }

    form = $('#dynamicForm');
    form.attr('action', url);
    form.empty();

    if (datas && typeof (datas) == 'object') {
        for (var item in datas) {
            var $_input = $('<input>');
            $_input.attr('type', 'hidden');
            $_input.attr('name', item);
            $_input.val(datas[item]);

            $_input.appendTo(form);
        }
    }

    form.submit();
}

// =================================================================== Others end

